--[[--
- @Copyright (C), 2016-, sixiong.
- @Name model.lua
- @Author sixiong
- @Version 1.0
- @Date: 2016年6月11日下午22:06:41
- @Description 模型层父类
- @Class
- @Function List
- @History <author> <time> <version > <desc>
            sixiong 2016年6月11日下午22:06:41  1.0  第一次建立该文件
--]] 
model = model or {}
 
--[[--
- @desc 获取模型   注意这里一定要每次都去加载模型文件，引用一次加载一次；
- @param string name 模型层不带后缀的文件名
- return table
--]]
function model.__get(name)  
       --dofile每次都会加载文件代码并执行
       --require 只加载一次，只执行一次
       --loadfile  只加载不执行
		return dofile( _PATH.._APP..'/models/' .. name .. '.lua'); 
end 

   
--[[
- @desc 定义模型 
- @param table  config  配置table
- @param string dbtype  模型层不带后缀的文件名  
- return table
--]] 
function model.__new(config, dbtype) 
 --dump('-----------------_new' .. dbtype);
    model['execute'] = nil;
    if not config or not dbtype then 
       return nil;
    end 
     
	model[dbtype] = model['__' .. dbtype](config); 
	return inherit(model);
end

model.redisfn = nil;
model.mysqlfn = nil;


--[[
- @desc  获取 redis 连接
- @param table  config  配置table
- return table
--]]
function model.__redis(config) 
	  -- dump('-----------------连接了redis----------'); 
     return function()
          	 if model.redisfn then
          	   return model.redisfn;
          	 end;
          	   
          	 local redis = require "resty.redis";
			 local red = redis:new();
			-- red:set_timeout(config["timeout"] or 5000);
			 local ok, err = red:connect(config["host"], config["port"]);

			 if not ok then 
			   ngx.say("redis failed to connect: ", err);
			   return  nil;
		     end
		  
			 model.redisfn = red; 
		     return red;  
         end
end


--[[
- @desc  获取 mysql 连接
- @param table  config  配置table
- return table
--]]
function model.__mysql(config)
	--dump('-----------------连接了mysql---------');
    return function(...) 
        if model.mysqlfn then 
           return (model.mysqlfn):query(...); 
        end
        
        local mysql = require "resty.mysql";
		local db, err = mysql:new();
		
		if not db then
		   return  ngx.say("failed to instantiate mysql: ", err); 
	    end
	    
		--db:set_timeout(config["timeout"] or 5000);  
		local ok, err, errno, sqlstate = db:connect{
		        host         = config["host"],
		        port         = config["port"],
		        database = config["database"],
		        user         = config["user"],
		        password = config["password"],
		        max_packet_size = config["max_packet_size"]
		};
--dump('-----------------连接了mysql---------');
		if not ok then
           return  ngx.log(ngx.ERR, "mysql connect failed: ", err);  
		end
		model.mysqlfn = db;
		
		return (model.mysqlfn):query(...);
      end
end


--[[
- @desc  关闭所有连接
- @param table  config  配置table
- return table
--]]
function model.__close()
      if  (model.redisfn) then 
          (model.redisfn):close();
      end
      
      if (model.mysqlfn) then 
         (model.mysqlfn):close(); 
      end
end

 return model;
